package com.tosee.dao.allocine;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.lang.StringUtils;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;

import com.tosee.model.allocine.AlloEpisode;
import com.tosee.model.allocine.AlloRecherche;
import com.tosee.model.allocine.AlloSerie;
import com.tosee.utils.ConstantesAllocine;

public class Test2 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Test2 t = new Test2();
        Map<String, String> map = new HashMap<String, String>();
        map.put(ConstantesAllocine.CODE_CODE, "1234");
        map.put(ConstantesAllocine.CODE_PARTENAIRE, ConstantesAllocine.VALEUR_CODE_PARTENAIRE);
        map.put(ConstantesAllocine.CODE_FILTER, ConstantesAllocine.VALEUR_CODE_FILTER);
        map.put(ConstantesAllocine.CODE_FORMAT, ConstantesAllocine.VALEUR_CODE_FORMAT_XML);
        Document doc = t.getInfo(map, ConstantesAllocine.URL_API_EPISODE);
        AlloEpisode rech = t.parseDocumentToResultEpisode(doc);
    }

    public Document getInfo(Map<String, String> _parametres, String _url) {
        // Instantiate an HttpClient
        HttpClient client = new HttpClient();

        // Instantiate a GET HTTP method
        PostMethod method = new PostMethod(_url);
        method.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");

        if(_parametres != null && CollectionUtils.isNotEmpty(_parametres.keySet())) {
            NameValuePair[] tabNameValuePair = new NameValuePair[_parametres.keySet().size()];
            int i = 0;
            for(String key : _parametres.keySet()) {
                tabNameValuePair[i] = new NameValuePair(key, _parametres.get(key));
                i++;

            }

            method.setQueryString(tabNameValuePair);

            try {
                int statusCode = client.executeMethod(method);

                System.out.println("Status Code = " + statusCode);
                System.out.println("QueryString>>> " + method.getQueryString());
                System.out.println("Status Text>>>" + HttpStatus.getStatusText(statusCode));

                // Get data as a String
                System.out.println(method.getResponseBodyAsString());

                SAXBuilder sxb = new SAXBuilder();
                Document document = null;
                try {
                    // On crée un nouveau document JDOM avec en argument le fichier XML
                    // Le parsing est terminé ;)
                    document = sxb.build(method.getResponseBodyAsStream());
                } catch (Exception e) {
                }

                // Onb parse le document XML ainsi récupéré afin d'en déduire une MAP
                return document;

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                method.releaseConnection();
            }
        }
        return null;
    }

    /**
     * Methde de parsing d'un document pour construction d'info série
     * 
     * @param document
     * @return
     */
    public AlloRecherche parseDocumentToResultSerie(Document _document) {
        Element racine = null;
        // Map<String, Object> mapRetour = new HashMap<String, Object>();
        AlloSerie alloSerie = null;
        AlloRecherche recherche = null;
        if(_document != null) {
            recherche = new AlloRecherche();
            racine = _document.getRootElement();
            racine.getChildren();
            recherche.setPage(parseElementValueToInteger(racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_PAGE,
                    ConstantesAllocine.NAMESPACE)));
            recherche.setNombre(parseElementValueToInteger(racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_COUNT,
                    ConstantesAllocine.NAMESPACE)));
            recherche.setNbResultat(parseElementValueToInteger(racine.getChildText(
                    ConstantesAllocine.PARSE_ELEMENT_TOTALRESULT, ConstantesAllocine.NAMESPACE)));
            recherche.setListeSerie(new ArrayList<AlloSerie>());
            List<Element> listSerie = racine.getChildren(ConstantesAllocine.PARSE_ELEMENT_TVSERIES,
                    ConstantesAllocine.NAMESPACE);
            for(Element serieTemp : listSerie) {
                alloSerie = new AlloSerie();
                alloSerie.setCode(parseElementValueToInteger(serieTemp
                        .getAttributeValue(ConstantesAllocine.PARSE_ATTRIBUTE_CODE)));
                alloSerie.setTitreVo(serieTemp.getChildText(ConstantesAllocine.PARSE_ELEMENT_TITLEVO,
                        ConstantesAllocine.NAMESPACE));
                alloSerie.setTitre(serieTemp.getChildText(ConstantesAllocine.PARSE_ELEMENT_TITLE,
                        ConstantesAllocine.NAMESPACE));
                alloSerie.setAnneeDebut(serieTemp.getChildText("yearStart", ConstantesAllocine.NAMESPACE));
                alloSerie.setAnneeFin(serieTemp.getChildText("yearEnd", ConstantesAllocine.NAMESPACE));
                recherche.getListeSerie().add(alloSerie);
            }
        }
        return recherche;
    }

    public AlloEpisode parseDocumentToResultEpisode(Document _document) {
        Element racine = null;
        Namespace ns = ConstantesAllocine.NAMESPACE;

        AlloEpisode alloEpisode = null;

        if(_document != null) {
            alloEpisode = new AlloEpisode();
            racine = _document.getRootElement();

            alloEpisode.setCode(parseElementValueToInteger(racine
                    .getAttributeValue(ConstantesAllocine.PARSE_ATTRIBUTE_CODE)));
            alloEpisode.setNumeroSaison(parseElementValueToInteger(racine.getChildText(
                    ConstantesAllocine.PARSE_ELEMENT_EPISODENUMSAISON, ns)));
            alloEpisode.setNumeroSerie(parseElementValueToInteger(racine.getChildText(
                    ConstantesAllocine.PARSE_ELEMENT_EPISODENUMSERIE, ns)));
            alloEpisode.setTitre(racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_TITLE, ns));
            String article = racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_TITLEVO_ARTICLE, ns);
            String titreVO = racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_TITLEVO, ns);
            StringBuilder sbTitre = new StringBuilder();
            if(StringUtils.isNotBlank(article)) {
                sbTitre.append(article);
            }
            if(StringUtils.isNotBlank(titreVO)) {
                sbTitre.append(titreVO);
            }
            alloEpisode.setTitreVO(sbTitre.toString());
            alloEpisode.setSynopsis(racine.getChildText(ConstantesAllocine.PARSE_ELEMENT_SYNOPSIS, ns));
        }

        return alloEpisode;
    }

    /**
     * Parsing de la valeur d'un element en int
     */
    public static Integer parseElementValueToInteger(String _elementValue) {
        Integer retour = null;
        if(StringUtils.isNotBlank(_elementValue)) {
            retour = Integer.parseInt(_elementValue);
        }
        return retour;
    }

}
